#include <iostream>
#include <string>
#include <functional>
#include <vector>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/wait.h>
using namespace std;

using fun_t =function<void()>; 
int gcount=0;
vector<fun_t> funcs;

//将信号 转换成 硬件时钟中断 表示自动调用
void handler(int signo)
{
    for(auto& e :funcs)
    {
        e();
    }
    cout<<"the gcount is"<<gcount <<endl;
    alarm(1);
}
int main()
{
    
    funcs.push_back([](){
        cout << "我是一个内核刷新操作" <<endl;
    });
    funcs.push_back([](){
        cout<<"我是一个检测进程时间片的操作，如果时间片到了，我会切换进程"<<endl;
    });
    funcs.push_back([]()
    { 
        cout << "我是一个内存管理操作，定期清理操作系统内部的内存碎片" << endl; 
    });
    alarm(1);

    signal(SIGALRM,handler);
    
    while(true)
    {
        pause();
        cout<<"CPU醒来了... 开始进程调度"<<endl;
        gcount++;
    }
}

// int count=0;
// void Print(int signnum)
// {
//     cout<<"the current number is" << count<<endl;
//     exit(1);
// }
// //看看一秒钟 能累加多少次
// int main()
// {
//     signal(14,Print);
//     alarm(1);
//     //int count=0;
//     while(true)
//     {
//         //IO 会影响计算速度
//         count++;
//     }


// }



//模拟kill
// void Usage(string tmp)
// {
//     cout<<"Usage the first is" <<tmp <<endl;  
// }
// //kill -8 pid
// int main(int argc,char* argv[])
// {
//     if(argc != 3)
//     {
//         Usage(argv[0]);
//         exit(1);
//     }
//     int signnumber=stoi(argv[1]);
//     pid_t pid =stoi(argv[2]);

//     int n=kill(pid,signnumber);
//     if(n== -1)
//     {
//         cout<<"kill  fault" <<endl;
//         exit(2);
//     }
//     else
//     {
//         cout<<"kill sucessfully"<<endl;
//     }
//     exit(0);
    
// }





// void PrintSign(const sigset_t& tsigset)
// {
//      cout<<"the current pid "<<getpid()<<"pending is :";
//     for(int signnum=31;signnum>0;signnum--)
//     {
//         //查看信号signnum 是否在tsigset 信号集里
//         if(sigismember(&tsigset,signnum))
//         {
//             cout<<1;
//         }
//         else
//         {
//             cout<<0;
//         }
//     }
//    cout<<endl;
    
// }
// void nothing_do(int singnumber)
// {
//     cout<<"the signnumber is "<<singnumber<<endl;
// }
// int main()
// {
//     //先屏蔽二号信号  否则把屏蔽集恢复成之前的就会 直接让信号抵达（也就是执行信号） 
//     signal(2,SIG_IGN);
//     sigset_t block,oldblock;
//     //先全部清零 做好初始化
//     sigemptyset(&block);
//     sigemptyset(&oldblock);

//     //把信号二传递进我的block 中，方便一会给内核设置
//     sigaddset(&block,2);


//     sigprocmask(SIG_SETMASK,&block,&oldblock);

//     int cnt=0;
//     while(true)
//     {
//         sigset_t pending;
//         sigpending(&pending);
//         PrintSign(pending);
//         cnt++;
//         if(cnt==10)
//         {
//             cout<<"解除对信号2 的屏蔽"<<endl;
//             sigprocmask(SIG_SETMASK,&oldblock,nullptr);
//         }
//         sleep(1); 
//     }
// }
















// void handler(int signlnum)
// {
//     cout<<"signlnum is " <<signlnum<<endl;
//     sleep(1);
//     //exit(1);
// }
// int main()
// {
//     signal(8,handler);
//     int a=10;
//     a/=0;
//     while(true);
// }
//int main()
//{
    //信号的捕捉
    //1.默认
    //2.忽略
    //3.自定义
    //signal(2,SIG_DFL);
    //signal(2,SIG_IGN);
    //signal(2,handler);
    





    // for(int i=1;i<32;i++)
    // {
    //     signal(i,handler);
    //     cout<<"开始捕捉 信号为"<<i<<endl;
    // }
    // signal(8,handler);
    // if(fork()==0)
    // {
    //     sleep(1);
    //     int a=10;
    //     a/=0;
    //     exit(1);
    // }
    // int status=0;
    // waitpid(-1,&status,0);

    // printf("exit signal: %d, core dump: %d\n", status&0x7F, (status>>7)&1);
    // //在core_dump 在位图中的第七位 ，记录信号是core 还是 term 
    // while(1);
    // return 0;



//}